;==============================================================================
; 调试步骤4清屏版：先清屏证明32位代码执行了
;==============================================================================
bits 16
org 0x7c00

start:
    cli
    xor ax, ax
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0x7c00
    sti
    
    mov ah, 0x0e
    mov al, '1'
    int 0x10
    
    in al, 0x92
    or al, 2
    out 0x92, al
    mov al, '2'
    int 0x10
    
    cli
    lgdt [gdt_descriptor]
    mov al, '3'
    int 0x10
    
    mov eax, cr0
    or eax, 1
    mov cr0, eax
    
    jmp 0x08:protected_mode

align 8
gdt_start:
    dq 0x0000000000000000

gdt_code:
    dw 0xFFFF
    dw 0x0000
    db 0x00
    db 0b10011010
    db 0b11001111
    db 0x00

gdt_data:
    dw 0xFFFF
    dw 0x0000
    db 0x00
    db 0b10010010
    db 0b11001111
    db 0x00

gdt_end:

gdt_descriptor:
    dw gdt_end - gdt_start - 1
    dd gdt_start

bits 32
protected_mode:
    ; 设置段寄存器
    mov ax, 0x10
    mov ds, ax
    mov ss, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    
    ; 设置栈
    mov esp, 0x90000
    
    ; 清屏 - 如果看到屏幕被清空，说明32位代码执行了
    mov edi, 0xb8000
    mov ecx, 80 * 25
    mov ax, 0x1f20          ; 蓝底白字空格（明显的颜色）
    rep stosw
    
    ; 在第一行显示消息
    mov edi, 0xb8000
    mov ax, 0x1f50          ; 'P' 蓝底白字
    stosw
    mov ax, 0x1f4d          ; 'M'
    stosw
    mov ax, 0x1f4f          ; 'O'
    stosw
    mov ax, 0x1f4b          ; 'K'
    stosw
    
    ; 挂起
    cli
    hlt
    jmp $

times 510 - ($ - $$) db 0
dw 0xaa55

